package jwr.basic;

import java.util.Scanner;

public class J16_Calculator {

	public static void main(String[] args) {
		//상속, 인터페이스, 기본클래스를 이용해서
		// 사칙연산을 수행하는 계산기 프로그램 작성
		Scanner sc = new Scanner(System.in);
		J16Cal c;
		
		String str;
		int a,b;
		
		System.out.println("두 정수와 연산자를 입력하시오.");
		a = sc.nextInt();
		b = sc.nextInt();
		
		str = sc.next();
		switch (str){
			case "+" :
				c = new J16Add();
				c.setValue(a, b);
				System.out.println(c.calculate());
				break;
			case "-" :
				c = new J16Sub();
				c.setValue(a, b);
				System.out.println(c.calculate());
				break;
			case "*" :
				c = new J16Mul();
				c.setValue(a, b);
				System.out.println(c.calculate());
				break;
			case "/" :
				c = new J16Div();
				c.setValue(a, b);
				System.out.println(c.calculate());
				break;
		}
		/*J16Cal c = new J16Add();
		c.setValue(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		c = new J16Mul();
		c.setValue(150, 25);
		System.out.println(c.toString());
		System.out.println(c.calculate());*/
		
		// +, x 연산을 위해
		// J16Add, J16Mul 객체를 생성했음
		// 하지만, -, / 연산을 위해 J16Sub, J16Div 객체도 생성해야 함
		// 사칙연산을 위해 불필요한 객체를 마구 생성하는 낭비가 발생
		// 해결책 - 상위 자료형변환 upcasting을 이용
		
		
		/*J16Add a = new J16Add();
		System.out.println(a.calculate());
		System.out.println(a.toString());
		
		J16Sub s = new J16Sub();
		System.out.println(s.calculate());
		System.out.println(s.toString());
		
		J16Mul m = new J16Mul();
		System.out.println(m.calculate());
		System.out.println(m.toString());
		
		J16Div d = new J16Div();
		System.out.println(d.calculate());
		System.out.println(d.toString());*/
		
		// +, x 연산을 위해
		// J16Add, J16Mul의 부모인 J16Cal 객체만 생성
		// 추후 -, / 연산을 위해 
		// J16Sub,J16Div 객체를 생성하더라도
		// 부모인 J16Cal 객체만 가져다 쓰면 됨
	} //main
} //class

class J16Cal implements J16CalService{
	private int a;
	private int b;
	
	public J16Cal() {
		super();
	}
	// 멤버변수 x, y의 초기화 작업은 setValue 메서드가 
	// 대신하므로 생성자는 주석처리함
	/*public J16Cal(int a, int b) {
		this.a = a;
		this.b = b;
	}*/

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	@Override
	public String toString() {
		return "J16Cal [a=" + a + ", b=" + b + "]";
	}

	@Override
	public void setValue(int x, int y) {
		a = x;
		b = y;
	}

	@Override
	public double calculate() {
		return 0;
	}
	
	
} //class

interface J16CalService {
	void setValue(int x, int y);
	double calculate();
} //interface

class J16Add extends J16Cal{
	@Override
	public double calculate() {
		double d = getA()+getB();
		return d;
	}
} //class

class J16Sub extends J16Cal{
	@Override
	public double calculate() {
		double d = getA() - getB();
		return d;
	}
}
class J16Mul extends J16Cal{
	@Override
	public double calculate() {
		double d = getA()*getB();
		return d;
	}
}

class J16Div extends J16Cal{
	@Override
	public double calculate() {
		double d = getA()/getB();
		return d;
	}
}











